/**
 * easyui工具类封装
 *
 *
 *
 *
 * */

var EasyUiUtil = {};
(function (exports) {
    /**
     * 重写方法.扩展支持rr数据返回
     */
    exports.resultToGridData=function(result){	//将ResultMsg对象转换成DataGrid的数据使用的格式

        if(!result)return {"total":0,"rows":[]};
        var data=result;
        if(typeof(result.code)!="undefined"){
            if(result.code!="0"){
                $.messager.alert('错误',result.errorMsg||'刷新后重试',"error");
                return {"total":0,"rows":[]};
            }
            data=result.data||{};
        }
        if($.isArray(data)){
            return {rows:data,total:data.length};
        }
        if(typeof(data.rows)!="undefined"&&typeof(data.total)!="undefined")return data;
        if(typeof(data.totalElements)!="undefined"){
            return {rows:data.content,total:data.totalElements};
        }
        console.log(result);
        throw "未能识别的数据格式";
    }

    exports.extendToobarParams=function (params,options) {
        //此处params需要注意.params对象是datagrid.queryParams,下面extend方法直接是修改的此对象.
        //必须直接操作.因为easyui中没有对返回值进行处理.仅仅作为是否继续的条件.如果不直接操作原始params对象会造成条件无效
        //param不会是null,undefined等.因为easyui中已经进行$.extend({},param)
        options=options||{};
        if(options.toolbar){
            return $.extend(params,EasyUiUtil.getFormData($(options.toolbar),false));
        }
        this.expandParamValue(params);
        return params;
    }

    exports.expandParamValue = function(param){		//扩展参数对象的值.如果值是选择器,则进行值选择
        if(!param)return;
        for(var k in param){
            var v=param[k];
            if(BaseUtil.isSelector(v)){	//仅会判断ID/class/attr选择器
                param[k]=BaseUtil.checkDefault($(v).val(),"");
            }
        }
    }

    /**
     * 获取result中的data数据,如果非ResultMsg对象则直接返回
     */
    function getResultData(result){	//
        if(!result)return [];
        var data=result;
        if(typeof(result.code)!="undefined"){
            data=result.data;
        }
        return data;
    }

    /**
     * 讲对象装换成[{text:'',value:''}]的样式
     */
    function objectToValueList(object,valueField,textField){
        var list=[];
        valueField=BaseUtil.checkDefault(valueField,"value");
        textField=BaseUtil.checkDefault(textField,"text");
        object=BaseUtil.getResultData(object);
        for(var i in object){
            var item={};
            item[valueField]=i;
            item[textField]=object[i];
            list.push(item);
        }
        return list;
    }
    /**
     * 将列表转换成对象
     */
    function valueListToObject(list,valueField,textField){
        var result={};
        valueField=BaseUtil.checkDefault(valueField,"value");
        textField=BaseUtil.checkDefault(textField,"text");
        list=BaseUtil.getResultDataList(list);
        for(var i=0;i<list.length;i++){
            var item=list[i];
            result[item[valueField]]=item[textField];
        }
        return result;
    }
    exports.getResultData=getResultData;
    exports.objectToValueList=objectToValueList;
    exports.valueListToObject=valueListToObject;
})(EasyUiUtil);

/**
 * 通用工具类
 */
(function (exports) {

    /**
     * 获取指定类型组件的参数属性
     * @param selecter 选择器
     * @param widgetType 工具类型
     * @returns {*}
     */
    function getOptions(selecter, widgetType) {
        if(!widgetType)throw "参数widgetType必须指定";
        t = BaseUtil.getParameter(selecter);
        return t[widgetType]("options");
    }

    /**
     * 获取指定属性
     * @param selecter 选择器
     * @param optionName 属性名称
     * @param widgetType 工具类型
     */
    function getOption(selecter, optionName, widgetType) {
        var options=getOptions(selector,widgetType);
        return options[optionName];
    }

    /**
     * 验证指定对象作为指定类型组件是否有指定的参数属性
     * @param selector
     * @param optionName
     * @param widgetType
     * @returns {boolean}
     */
    function hasOption(selector,optionName,widgetType){
        var options=getOptions(selector,widgetType);
        return BaseUtil.checkValue(options[optionName]);
    }

    /**
     * 设置单个属性
     * @param selector
     * @param optionName
     * @param value
     * @param widgetType
     */
    function setOption(selector,optionName,value,widgetType){
        var options=getOptions(selector,widgetType);
        options[optionName]=value;
    }

    /**
     * 设置多个属性values格式{key:value, key:value}
     * @param selector
     * @param values
     * @param widgetType
     */
    function setOptions(selector,values,widgetType){
        var options=getOptions(selector,widgetType);
        if(!values)return;
        for(var name in values){
            options[name]=values[name];
        }
    }

    exports.getOptions=getOptions;
    exports.getOption=getOption;
    exports.hasOption=hasOption;
    exports.setOption=setOption;
    exports.setOptions=setOptions;
})(EasyUiUtil);

/**
 * easyui datagrid封装方法
 */
(function (exports) {

    /**
     * 重新加载DataGrid
     * @param selecter 选择器
     * @param url 加载路径
     * @param data 加载参数
     * @param options 自定义属性
     */
    function reloadDataGrid(selecter, url, data, options) {
        if(url&&BaseUtil.isObject(url)) { // 判断url是否为 url跳过
            data = url;
            url = null;
        }
        var grid = BaseUtil.getJQuery(selecter);
        if(url) {
            EasyUiUtil.setOption(grid, "url", url, "datagrid");
        }
        grid.datagrid("reload");
    }

    exports.reloadDataGrid=reloadDataGrid;
})(EasyUiUtil);






/**
 * tabs方法封装
 */
(function (exports) {

    /**
     * 验证面板是否存在
     * @param selector 面板对象
     * @param which
     */
    function tabExists(selector, which) {
        var tab = BaseUtil.getJQuery(selector);
        if(tab && tab.length > 0) {
            return tab.tabs("exists", which);
        }
        return false;
    }

    /**
     * 选中tab
     * @param selector
     * @param which 参数可以是选项卡面板的标题或者索引
     */
    function selectTab(selector, which) {
        var tab = BaseUtil.getJQuery(selector);
        if(tab && tab.length > 0) {
            tab.tabs("select", which);
        }
    }

    /**
     * 获取表单数据
     * @param obj
     */
    function getFormData(obj) {
        return BaseUtil.getFormData(obj);
    }
    
    function setFormData(obj, data) {
        var t=BaseUtil.getJQuery(obj);
        t.form("load",data);
    }

    /**
     * 表单验证
     * @param obj
     */
    function validateForm(obj) {
        var form = BaseUtil.getJQuery(obj);
        return form.form("validate");
    }

    exports.tabExists = tabExists;
    exports.selectTab = selectTab;
    exports.getFormData  = getFormData ;
    exports.setFormData  = setFormData ;
    exports.validateForm  = validateForm ;
})(EasyUiUtil);

/**
 * 消息提示类
 */
(function (exports) {
    /**
     * 提示框
     * @param title 标题
     * @param msg 消息
     * @param ok 确认
     * @param cancel 取消
     */
    function confirm(title, msg, ok, cancel) {
        if(BaseUtil.isFunction(msg)) {
            cancel = ok;
            ok = msg;
            msg = title;
            title = "确认"
        }
        $.iMessager.confirm(title, msg, function (r) {
            if(r){
                if(BaseUtil.isFunction(ok)) {
                    BaseUtil.callFunction(ok);
                }
            } else {
                if(BaseUtil.isFunction(cancel)) {
                    BaseUtil.callFunction(cancel);
                }
            }
        });
    }

    /**
     * 删除提示框
     * @param title 标题
     * @param msg 消息
     * @param ok 确认
     * @param cancel 取消
     */
    function deleteConfirm(title, msg, ok, cancel) {
        if(BaseUtil.isFunction(title)) {
            cancel = ok;
            ok = title;
            msg = "数据删除后无法恢复,确认删除数据?";
            title = "确认删除"
        }
        if(BaseUtil.isFunction(msg)) {
            cancel = ok;
            ok = msg;
            msg = title;
            title = "确认删除"
        }
        confirm(title||"确认删除", msg||"数据删除后无法恢复,确认删除数据?", ok, cancel);
    }

    /**
     * show 方法
     * @param title 标题
     * @param msg 展示信息
     * @param options
     */
    function show(title, msg, options) {
        var defaultOptions = {
            timeout:5000,
            showType:'slide',
            title:'提示消息',
            msg:'提示消息'

        }
        if(!title) {
            options = {};
            msg = "提示消息";
            title = "提示消息";
        }
        if(!msg || BaseUtil.isObject(msg)) {
            options = msg||{};
            msg = title||"提示消息";
            title = "提示消息";
        }
        options = options||{};
        options.title =title;
        options.msg =msg;
        options = $.extend({},defaultOptions, options);
        $.iMessager.show(options);
    }
    exports.confirm=confirm;
    exports.deleteConfirm=deleteConfirm;
    exports.show=show;
})(EasyUiUtil);

/**
 * 弹出框
 * 弹出框工具类
 */
(function (exports) {

    /**
     * 弹出Frame对话框
     * @param pageUrl 访问路径
     * @param postData 数据
     * @param success 成功调用参数
     * @param options
     *      width 宽度 默认80%
     *      height 高度  默认80
     *      noheader false 无头部 true 有
     *      maximized 打开默认最大化
     *      maximizable 是否显示最大化按钮
     *
     *      onOpen 打开事件
     *      onClose 关闭之后触发
     *      onDestroy 销毁之后触发
     *
     */
    function openFrameDialog(pageUrl, postData, success, options) {
        var t=$("<div>");
        options=$.extend({
            width:"80%",
            height:"80%",
            closed:false,
            noheader:false,
            maximized:false,
            maximizable:true,
            bindEvent:true,
            title:"选择",
            destroyWhenClose:false,
            bindData: true,
            onOpen:function(){},
            onClose:function(){
                if(options.destroyWhenClose)t.dialog("destroy");
            },
            onDestroy:function(){

            },
        },options);

        if(t.dialogId)t.attr("id",options.dialogId);
        var randomKey=EventBridge.getRandomKey();		//产生一个随机key用于事件绑定
        pageUrl=BaseUtil.buildUrl(pageUrl,postData);
        var content=buildFrameText(pageUrl,{"frame-key":randomKey});
        var dialogOptions={
            border:false,
            closed:options.closed,
            noheader:options.noheader,
            maximized:options.maximized,
            maximizable:options.maximizable,
            title:options.title,
            width:options.width,
            height:options.height,
            onOpen:options.onOpen,
            onClose:options.onClose,
            onDestroy:options.onDestroy,
            content: content,
            modal: true,
            toolbar:options.toolbar,
            buttons:options.buttons
        };
        t.dialog(dialogOptions);
        //getDialogManager().addDialog(t,dialogOptions);
        if(options.bindEvent){
            (function(dialog,randomKey,success,options){
                /**
                 * result结构{data:回传数据,其他参数}	其他参数视情况而定.包括: close(关闭对话框),unbind(移除绑定)
                 */
                EventBridge.bindOnce("_FrameDialogSuccess_",function(key,result){
                    if(key===randomKey){
                        result=$.extend({
                            destroy:true,
                            close:true,
                            unbind:true
                        },result);
                        var data=result.data;
                        if(typeof(success)=="function"){
                            success.call(dialog,data,result);
                        }
                        if(result.destroy)dialog.dialog("destroy");
                        else if(result.close)dialog.dialog("close");
                        return result.unbind;
                    }
                    return false;
                });
            })(t,randomKey,success,options);
        }
        return t;

    }

    /**
     * 构建iframe的文本
     * attrs:	参数值
     */
    function buildFrameText(url,attrs){
        var htmls=[];
        htmls.push('<iframe src="');
        htmls.push(BaseUtil.checkDefault(url,""));
        htmls.push('" width="100%" height="100%" frameborder="0" scrolling="no" style="box-sizing: border-box;vertical-align: top;"');
        if(attrs){
            for(var i in attrs){
                htmls.push(' {}="{}"'.format(i,BaseUtil.checkDefault(attrs[i]),""));
            }
        }
        htmls.push('></iframe>');
        return htmls.join("");
    }

    /**
     * 关闭当前对话框并且将参数传回.
     * 用于关闭frame对话框,
     * 关闭由openFrameDialog方法打开的对话框
     */
    function closeCurrentDialog(data){
        var result={
            destroy:false,
            close:true,
            unbind:false,
            data:data
        };
        triggerCurrentDialog(result);
    }
    /**
     * 销毁对对话框
     * 用于关闭frame对话框,
     * 关闭由openFrameDialog方法打开的对话框
     * 如果传递了参数win
     * 参数:
     * data		回传的数据
     * win		限定的对话框,如果空则表示当前对话框
     *
     */
    function destroyCurrentDialog(data,win){
        var result={
            destroy:true,
            close:true,
            unbind:true,
            data:data
        };
        triggerCurrentDialog(result,win);
    }
    /**
     * 回调当前对话框,
     * 回调由openFrameDialog方法打开的对话框.
     * 不会关闭和解绑对话框的方法
     */
    function callCurrentDialog(data,win){
        var result={
            destroy:false,
            close:false,
            unbind:false,
            data:data
        };
        triggerCurrentDialog(result,win);
    }
    /**
     * result中
     * 用于关闭frame对话框,
     * 调用由openFrameDialog方法打开的对话框
     */
    function triggerCurrentDialog(result,win){
        var frame=BaseUtil.getCurrentFrame(win);
        if(!frame)return;
        var key=frame.getAttribute("frame-key");
        if(!key)throw "当前iframe节点无frame-key属性,禁止使用此方法";
        EventBridge.trigger("_FrameDialogSuccess_",key,result);
    }
    exports.openFrameDialog=openFrameDialog;
    exports.buildFrameText=buildFrameText;
    exports.closeCurrentDialog=closeCurrentDialog;
    exports.destroyCurrentDialog=destroyCurrentDialog;
    exports.callCurrentDialog=callCurrentDialog;
    exports.triggerCurrentDialog=triggerCurrentDialog;
})(EasyUiUtil);
